package org.otherworld.process;

import java.io.File;

import java.io.FilenameFilter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Hashtable;



/**
 * A program fájlokkal kapcsolatos javaspecifikus osztálya
 * @author shinean
 *
 */
public class JavaFileUtils {

	/**
	 * Listázza egy könyvtár tartalmát
	 * @param root (string, célkönyvtár)
	 * @return ArrayList a filenevekkel, ha rossz az elérés, akkor null
	 */
	public ArrayList<String> listDirectory(String root) {
		File path = new File(root);
		if (path.isDirectory()) {
			String[] files = path.list();
			File temp = null;
			String name = "";
			ArrayList<String> fullFiles = new ArrayList<String>();
			for (int i=0;i<files.length;i++) {
				temp = new File(root+files[i]);
				name = temp.getName();
				if (temp.isDirectory()) {
					name = "<dir>"+name;
				}
				fullFiles.add(name);
			}
			Collections.sort(fullFiles);
			return fullFiles;
		}
		return null;
	}
	
	/**
	 * Megvizságlja, hogy az aktuális user milyen jogokkal rendelkezik az adott fájlra
	 * @param file (File fájlobjektum)
	 * @return String (az jogok stringbe fűzve)
	 */
	private String filePermissionMasker(File file) {
		boolean canWrite = file.canWrite();
		boolean canRead = file.canRead();
		boolean canExecute = file.canExecute();
		String mask = "";
		if (canWrite) {
			mask += "+w ";
		}
		if (canRead) {
			mask += "+r ";
		}
		if (canExecute) {
			mask += "+e ";
		}
		return mask;
	}
	
	/**
	 * Egy fájlnevet keres a megadott könyvtárban
	 * @param root (keresési könyvtár)
	 * @param fileName (keresendő fájlnév)
	 * @return ArrayList (azonos nevű fájlok)
	 */
	public ArrayList<String> search(String root,final String fileName) {
		FilenameFilter fileFilter = new FilenameFilter() {
			public boolean accept(File pathname, String name) {
				// maszkolást itt kéne megoldalni
				// példa: autoex*
				if (fileName.equals(name)) {
					return true;
				} else {
					return false;
				}
			}
		};
		File dir = new File(root);
		File[] searchResult = dir.listFiles(fileFilter);
		ArrayList<String> f = new ArrayList<String>();
		File temp;
		String name = "";
		for (int i=0;i<searchResult.length;i++) {
			temp = searchResult[i];
			name = temp.getAbsolutePath();
			if (temp.isDirectory()) {
				name = "<dir>"+name;
			}
			f.add(name);
		}
		return f;
	}
	
	/**
	 * Egy fileról ad vissza információkat
	 * @param path (string, fájl elérése)
	 * @return Hashtable<String,Object> a fájl infókkal
	 */
	public Hashtable<String, Object> fileInfo(String path) {
		File file = new File(path);
		Hashtable<String, Object> fileInfo = new Hashtable<String, Object>();
		fileInfo.put("name", file.getName());
		fileInfo.put("size", file.length() +" bytes");
		Date date = new Date(file.lastModified());
		SimpleDateFormat sdf = new SimpleDateFormat();
		fileInfo.put("modifyDate", sdf.format(date));
		fileInfo.put("permissions", this.filePermissionMasker(file));
		fileInfo.put("type", !file.isDirectory() ? "directory" : "file");
		return fileInfo;
	}
	
	
	
	public static void main(String[] args) throws Exception{
		JavaFileUtils file = new JavaFileUtils();
		// Könyvtárlistázási példa
		
		/*
		
		ArrayList<String> files = file.listDirectory("c:\\Users\\");
		for (String f : files) {
			System.out.println(f);
		}
		*/
		
		// File info példa
		/*Hashtable<String, Object> fileInfo = file.fileInfo("d:\\forza verseny.xls");
		Iterator<String> iter = fileInfo.keySet().iterator();
		String key = "";
		Object value = "";
		while (iter.hasNext()) {
			key = iter.next();
			value = fileInfo.get(key);
			System.out.println(key+" : "+value);
		}*/
		
		//file keresés példa
		ArrayList<String> result = file.search("c:\\","AMD");
		for (String name : result) {
			System.out.println(name);
		}
		
	}
	
	
}
